home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / music_utilities / pt011.dms / pt011.adf / K1_Editor / GetDump.c < prev    next >
C/C++ Source or Header  |  1990-03-20  |  6KB  |  216 lines

  1. #include <workbench/startup.h>
  2. #include <midi/kawai_k1.h>
  3. #include <libraries/reqbase.h>
  4.  
  5. struct IntuitionBase    *IntuitionBase;
  6. struct GfxBase            *GfxBase;
  7. struct MidiBase            *MidiBase;
  8. struct ReqBase            *ReqBase;
  9.  
  10. struct MDest            *dest;
  11. struct MSource            *src;
  12. struct MRoute            *inroute, *outroute;
  13.  
  14. struct FileRequester    MyFileReqStruct;
  15. char                    filename[FCHARS],
  16.                         directoryname[DSIZE],
  17.                         answerarray[DSIZE+FCHARS],
  18.                         *WriteError[4] =
  19.                         { "Einfacher Schreibfehler","Der Synthspeicher ist schreibgeschützt!",
  20.                           "Keine Cartridge vorhanden!","K1 antwortet nicht!" };
  21. struct TRStructure        meintrs = { 0,0,0,0,0,0,"Sag mir:",0xFFFF,0,0,0,0,0,0 };
  22.  
  23. UBYTE                    data[8082],        /* kplt. SoundBank 64 S + 32 M */
  24.                         request[9] = { MS_SYSEX,MID_KAWAI,0,K1_OBDR,K1_GROUP,KAWAI_K1,K1_INT,0,MS_EOX };
  25.  
  26. struct MRouteInfo        riin = { MMF_SYSEX, -1, 0, 0, { 0,0,0,0 }, { 0,0,0,0 } };
  27.                         /* d.h. nur SysExs passieren die Route */
  28.  
  29.  
  30. /***************************************************************************/
  31.  
  32.  
  33. int WoIsK1()                    /* -1 bei nirgends Ack, sonst 0..15 */
  34. {    static UBYTE req[5] = { MS_SYSEX,MID_KAWAI,0,K1_MIR,MS_EOX };
  35.     UBYTE *ack;
  36.     int chn;
  37.  
  38.     for(chn=0; chn<16; chn++)
  39.     {    req[OFFS_CHAN] = chn;
  40.         PutMidiMsg(src, req);
  41.         Delay(25L);
  42.         while(ack = GetMidiMsg(dest))
  43.             if(ack[OFFS_FUNC] == K1_MIA) return chn;
  44.     }
  45.     return -1;
  46. }
  47.  
  48. GetBlock(channel, ie, nr, data)        /* Einmal leersaugen, bitte */
  49.   int channel,ie,nr;
  50.   UBYTE *data;
  51. {    UBYTE *msg;
  52.  
  53.     request[OFFS_CHAN] = channel;
  54.     request[OFFS_FUNC] = K1_ABDR;
  55.     request[OFFS_SUB1] = ie;
  56.     request[OFFS_SUB2] = nr;
  57.     PutMidiMsg(src, request);
  58.  
  59.     WaitPort(dest->DestPort);
  60.     if(msg = GetMidiMsg(dest))
  61.     {    if(msg[OFFS_FUNC]==K1_ABDD) movmem(msg+OFFS_DATA, data, (nr < 64) ? 32*88 : 32*76);
  62.         FreeMidiMsg(msg);
  63.     }
  64. }
  65.  
  66. PutBlock(channel, ie, nr, data)        /* Einmal vollpumpen, bitte */
  67.   int channel, ie, nr;
  68.   UBYTE *data;
  69. {    UBYTE *msg, *reply;
  70.     int err = 4, bs = (nr < 64) ? 32*88 : 32*76;    /* BlockSize abh. von Single/Multi */
  71.     register int i;
  72.  
  73.     if(msg = AllocMem(9+bs, MEMF_PUBLIC+MEMF_CLEAR))
  74.     {    movmem(request, msg, 9);    /* den Header vom Request übernehmen */
  75.         msg[OFFS_CHAN] = channel;
  76.         msg[OFFS_FUNC] = K1_ABDD;
  77.         msg[OFFS_SUB1] = ie;
  78.         msg[OFFS_SUB2] = nr;
  79.         movmem(data, msg+OFFS_DATA, bs);
  80.         msg[OFFS_DATA+bs] = MS_EOX;
  81.         PutMidiMsg(src, msg);        /* Hinfort! Weiche von mir, elender Dump! */
  82.     }
  83.  
  84.     WaitPort(dest->DestPort);
  85.     if(reply = GetMidiMsg(dest))
  86.     {    err = reply[OFFS_FUNC];
  87.         FreeMidiMsg(reply);
  88.     }
  89.  
  90.     if(msg) FreeMem(msg, 9+bs);
  91.     return(err & 7);
  92. }
  93.  
  94. int UserRequest(text,a,b,c)
  95.   char *text,*a,*b,*c;
  96. {
  97.     meintrs.Text = text;
  98.     meintrs.NegativeText = a;        /* 0 (rechts) */
  99.     meintrs.PositiveText = b;        /* 1 (links) */
  100.     meintrs.MiddleText = c;            /* 2 (mitte) */
  101.  
  102.     return TextRequest(&meintrs);
  103. }
  104.  
  105. MakeInfo(s)
  106.   char *s;
  107. {    UBYTE info[2048];
  108.     FILE *ifp, *fi;
  109.     int l;
  110.     char t[64];
  111.  
  112.     strcpy(t,s); strcat(t,".info");
  113.     if(ifp=fopen("T:MIDIicon","r"))
  114.     {    l = fread(info, 1, 2048, ifp);
  115.         if(fi=fopen(t,"w"))
  116.         {    fwrite(info, l, 1, fi);
  117.             fclose(fi);
  118.         }
  119.         fclose(ifp);
  120.     }
  121. }
  122.  
  123. Init()
  124. {
  125.     if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0L)))
  126.         shit(NULL);
  127.     GfxBase=IntuitionBase->GfxBase;
  128.     if(!(ReqBase = (struct ReqBase *)OpenLibrary("req.library", 0L)))
  129.     {    DisplayBeep(0L);
  130.         shit(NULL);
  131.     }
  132.     if(!(MidiBase = OpenLibrary(MIDINAME, MIDIVERSION)))
  133.         shit("Keine midi.library!");
  134.     dest = CreateMDest(NULL, NULL);
  135.     src = CreateMSource(NULL, NULL);
  136.     inroute = MRouteDest("MidiIn", dest, &riin);
  137.     outroute = MRouteSource(src, "MidiOut", &riin);
  138.  
  139.     MyFileReqStruct.PathName = answerarray;
  140.     MyFileReqStruct.Dir = directoryname;
  141.     MyFileReqStruct.File = filename;
  142.     MyFileReqStruct.dirnamescolor = 2;
  143.     MyFileReqStruct.devicenamescolor = 2;
  144. }
  145.  
  146. shit(t)
  147.   char *t;
  148. {
  149.     if(t) UserRequest(t,NULL,NULL," Tschüß! ");
  150.     if(inroute) DeleteMRoute(inroute);
  151.     if(outroute) DeleteMRoute(outroute);
  152.     if(dest) DeleteMDest(dest);
  153.     if(src) DeleteMSource(src);
  154.     if(ReqBase) { PurgeFiles(&MyFileReqStruct); CloseLibrary(ReqBase); }
  155.     if(MidiBase) CloseLibrary(MidiBase);
  156.     if(IntuitionBase) CloseLibrary(IntuitionBase);
  157.     exit(0);
  158. }
  159.  
  160. char *extend(name,ext)
  161.   char *name, *ext;
  162. {    static char buffer[64];
  163.     char *s;
  164.  
  165.     if(s = rindex(name, '.'))
  166.         if(strncmp(s, ext) == 0) return name;
  167.  
  168.     strcpy(buffer,name);
  169.     strcat(buffer,ext);
  170.     return buffer;
  171. }
  172.  
  173. main(argc, argv)
  174.   int argc;
  175.   char *argv[];
  176. {    int c, e, err;
  177.     char *s;
  178.     FILE *fp;
  179.  
  180.     Init();
  181.     if((c = WoIsK1()) == -1)
  182.         shit("Kein K1 gefunden.");
  183.  
  184.     do
  185.     {    e = UserRequest("GET von welcher Bank?"," INT "," EXT ",NULL);
  186.         GetBlock(c, e, 0 , data);
  187.         GetBlock(c, e, 32, &data[2816]);
  188.         GetBlock(c, e, 64, &data[5650]);
  189.  
  190.         if(UserRequest("Was tun mit den Daten?"," PUT "," SAVE ",NULL))
  191.         {    /* SAVE */
  192.             MyFileReqStruct.Flags = FRQCACHINGM+FRQINFOGADGETM+FRQSAVINGM;
  193.             MyFileReqStruct.Title = "Dumpdatei abspeichern:";
  194.             MyFileReqStruct.Show[0] = '*';
  195.             strcpy(MyFileReqStruct.Show + 1, ".dump");
  196.             if(FileRequester(&MyFileReqStruct))
  197.             {    if(fp = fopen(s = extend(answerarray, ".dump"), "w+"))
  198.                 {    fwrite(data, 8082, 1, fp);
  199.                     fclose(fp);
  200.                     MakeInfo(s);        /* Icon erstellen für PutDump-Programm */
  201.                 }
  202.                 else SimpleRequest("Ich kann %s nicht öffnen.", s);
  203.             }
  204.         }
  205.         else    /* PUT */
  206.         {    e = UserRequest("PUT in welche Bank?"," INT "," EXT ",NULL);
  207.             if(!(err = PutBlock(c, e, 0 , data)))
  208.                 if(!(err = PutBlock(c, e, 32, &data[2816])))
  209.                     err = PutBlock(c, e, 64, &data[5650]);
  210.             if(err) SimpleRequest("%s", WriteError[err]);
  211.         }
  212.     } while(UserRequest("Noch einen GET?"," NEIN ","  JA  ",NULL));
  213.  
  214.     shit(NULL);
  215. }
  216.